package 设计原则.里氏替换原则;

/**
 * 简述：任何能使用父类对象的地方，都应该能透明地替换为子类对象。
 *
 * 需求：将长方形的宽改成比长大 1 。
 *
 * 反例：在父类`Rectangular`下，业务场景符合逻辑。现有子类`Square`，替换后如何。
 * @author lxiaol
 * @date 2021年06月24日 15:30
 */
public class negtive {
    static class Rectangular {
        private Integer width;
        private Integer length;

        public Integer getWidth() {
            return width;
        }

        public void setWidth(Integer width) {
            this.width = width;
        }

        public Integer getLength() {
            return length;
        }

        public void setLength(Integer length) {
            this.length = length;
        }

    }

    // 正方形
    static class Square extends Rectangular {
        private Integer sideWidth;

        @Override
        public Integer getWidth() {
            return sideWidth;
        }

        @Override
        public void setWidth(Integer width) {
            this.sideWidth = width;
        }

        @Override
        public Integer getLength() {
            return sideWidth;
        }

        @Override
        public void setLength(Integer length) {
            this.sideWidth = length;
        }
    }


    static class Utils{
        public static void transform(Rectangular graph){
            while ( graph.getWidth() <= graph.getLength() ){
                graph.setWidth(graph.getWidth() + 1);
                System.out.println("长："+graph.getLength()+", 宽："+graph.getWidth());
            }
        }
    }

    public static void main(String[] args) {
         Rectangular graph = new Rectangular();
//        Rectangular graph = new Square(); //替换后运行将是无限死循环。
        graph.setWidth(20);
        graph.setLength(30);

        Utils.transform(graph);
    }
}
